package com.hanserwei.han_picture.utils;

/**
 * 解决数据万象颜色缺失问题
 */
public class ColorTransformUtils {

    private ColorTransformUtils() {
        // 工具类不需要实例化
    }

    /**
     * 对该算法进行分析
     * e0020转换为e00200 还是 e00020:
     * 在 COS中, 会有前导 0 的情况, 前面两位 和 中间两位 和 最后两位 互不相干,
     * <p>
     * 所以, 我们要分开看:
     * 对于前导 0, 由于 0 在高位时对低位的数字毫无影响, 所以可以省略, 而在低位的 0 不能省略。
     * <p>
     * 分析:
     * e0020 就是这样, 第一位是 e, e 在前两位的高位, 所以他是没有省略的, 所以在完整的写法中前两位肯定是 e0。
     * 那么对剩下的 020 进行分析: 0 在高位, 如果说 02 是中间两位那么这个 0 显然可以省略, 即 02 -> 2, 但是与题设矛盾
     * 所以 020 实际上应该是: 0020,
     * 最终得出结果: e0020 -> e00020。
     * <p>
     * 继续分析其它例子,
     * 比如 0c00, 看前两位 0c, 如果 0c是 RR, 那么 0c 可以省略为 c, 但是前两位是 0c, 说明 0c 应该是 00c, 所以前两位是 00
     * 中间两位是 c0, 现在剩最后一位 0, 补全为 00, 所以完整写法是 00c000。
     *
     * @param rawColor 十六进制颜色
     * @return 补全后的颜色
     */
    public static String getStandardColor(String rawColor) {
        if (rawColor == null || !rawColor.startsWith("0x")) {
            throw new IllegalArgumentException("必须以 0x 开头的十六进制字符串");
        }
        // hex = rr gg bb
        String hex = rawColor.substring(2).toLowerCase();
        int length = hex.length();

        // 将rgb分为三块
        String r = "00", g = "00", b = "00";

        if (length == 6) {
            return "0x" + hex;
        }
        if (length == 5) {
            r = hex.substring(0, 2);
            // 如果 r 以 0 开头, 肯定省略了 1 位, r 则只占了一位且 r = 00, 需要对剩下 4 位进行分析
            // r 不以 0 开头, 那么就没有进行省略, r 就占了前两位, 继续对 g 和 b 分析, 需要对剩下 3 位进行分析
            if (r.startsWith("0")) {
                r = "00";
                // 现在剩余后面 4 位, 不需要分析了, g 和 b 各占 2 位, 是正常的
                g = hex.substring(1, 3);
                b = hex.substring(3, 5);
            } else {
                // 现在剩余后三位
                // 首先对 g 分析, 如果 g 以 0 开头, 那么 g 肯定为 00, 占了 1 位, b 就是最后两位
                // 如果 g 不以 0 开头, 那 b 就是省略的那一位, 即 b= 0 + 最后一位
                g = hex.substring(2, 4);
                if (g.startsWith("0")) {
                    g = "00";
                    b = hex.substring(3, 5);
                } else {
                    b = "0" + hex.substring(length - 1);
                }
            }
        }
        if (length == 4) {
            r = hex.substring(0, 2);
            // 如果 r 以 0 开头, r 只占了 1 位, 且 r = 00, 继续分析剩下的三位
            // r不以 0 开头, 那么就没有进行省略, 所以 r 占了前两位, 剩余两位, 直接在 g 和 b 左边补 0 即可
            if (r.startsWith("0")) {
                r = "00";
                // 现在剩余后面 3 位, 先对 g 分析
                // g 以 0 开头, 那么 g 就占了一位, 剩下的两位就是 b 了, 所以 g = 00, b = 最后两位
                // g 不以 0 开头, 则 g 占两位, 最后一位就是 b, b= "0" + 最后一位
                g = hex.substring(1, 3);
                if (g.startsWith("0")) {
                    g = "00";
                    b = hex.substring(2, 4);
                } else {
                    b = "0" + hex.substring(length - 1);
                }
            } else {
                // 现在剩余后 2 位, 无需分析, b 省略了 1 个 0, g 也省略了 1 个 0, 补全即可
                g = "0" + hex.charAt(2);
                b = "0" + hex.substring(length - 1);
            }
        }
        if (length == 3) {
            // 这种情况三位都省略了, 那么直接补 0 即可
            // COS中 #fff 为 #0f0f0f, 不是 #ffffff(这是 css 的简写)
            r = "0" + hex.charAt(0);
            g = "0" + hex.charAt(1);
            b = "0" + hex.charAt(2);
        }
        return "0x" + r + g + b;
    }
}